<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        body{
            padding-bottom: 800px;
        }
        .box{
            border: 1px solid black;
            padding: 20px;
        }
    </style>
</head>
<body>
    <div id="app" class="box">
        <h4>父组件</h4>
        <!--
            + 在HTML标签上(包含自定义标签)定义的属性名，无论是静态还是动态，都会识别为小写
                 - props 拦截的属性定义的属性名如果是驼峰属性名，vue操作时会从标签上加载对应的链子符属性名
                 - 如果在props中未定义，$attrs和标签上依然是连字符规则
            + 在HTML标签上定义的自定义事件，无论是静态还是动态，都会识别为小写
                 - vue渲染时，事件以全小写的方式绑定组件元素上，但$attrs会将事件首字母转为大并添加关键字on进行组合记录
                 - emits拦截是也是全小写

                 - 如果事件名使用了连字符定义，vue渲染时，事件以链子符的方式绑定组件元素上，但$attrs会将事件转为大驼峰并添加关键字on进行组合记录
                 - emits 以小驼峰的方式进行拦截

                 - 如果事件名中存在特殊字符，事件名包含特殊字符
        -->
        <comp-one :userList="userList" @sendMsg="sendMsg"></comp-one>
        <comp-one :user-list="userList" @send-msg="sendMsg"></comp-one>
        <!-- vue指令只有紧随的：表示参数，后续的：都是参数名 -->
        <comp-one v-on:update:msg="sendMsg"></comp-one>
        <comp-one @update:msg="sendMsg"></comp-one>
        <!-- emits 不拦截自定义事件，依然可以用 $emit 触发 => 触发名称遵守上述规则 -->
        <comp-one @update:info="sendMsg"></comp-one>
    </div>

    <script type="text/x-template" id="compOne">
        <div class="box">
            <h4>子组件</h4>
            <input type="button" value="触发拦截事件-sendmsg" @click="doSendMsg()">
            <input type="button" value="触发拦截事件-sendMsg" @click="doSendMsg2()">
            <input type="button" value="触发拦截事件-update:msg" @click="doUpateMsg()">
            <input type="button" value="触发拦截事件-update:info" @click="doUpateInfo()">
        </div>
    </script>

    <script type="module"> 
        import { createApp } from "../../assets/vue3/vue.esm-browser.js";
        const app = createApp({
            data(){
                return {
                    userList:[1,2,3,4,5]
                }
            },
            methods: {
                sendMsg() {
                    console.log("父组件sendMsg")
                }
            },
        });

        app.component("CompOne",{
            template:"#compOne",
            props:[
                // "userlist"
                "userList"
            ],
            emits:[
                "sendmsg",
                "sendMsg",
                "update:msg"
            ],
            methods: {
                doSendMsg() {
                    console.log(1111)
                    this.$emit("sendmsg")
                },
                doSendMsg2() {
                    console.log(1111)
                    this.$emit("sendMsg")
                },
                doUpateMsg(){
                    console.log(1111)
                    this.$emit("update:msg")
                },
                doUpateInfo(){
                    this.$emit("update:info")
                }
            },
        })
        
        app.mount("#app")
    </script>
</body>
</html>